package cn.tedu.ivos.audit.service.impl;

import cn.tedu.ivos.application.pojo.entity.Application;
import cn.tedu.ivos.audit.mapper.AuditMapper;
import cn.tedu.ivos.audit.pojo.entity.Audit;
import cn.tedu.ivos.audit.pojo.vo.AuditVO;
import cn.tedu.ivos.audit.service.AuditService;
import cn.tedu.ivos.base.enums.AuditStatusEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

/**
 * @Transactional是Spring提供的一个用于管理事务的注解，用来管理类或方法上的事务行为
 * 在对数据库做操作时，可以确保方法中的所有数据库操作都在同一个事务中执行，要么都成功，要么都失败
 */
@Transactional
@Slf4j
@Service
public class AuditServiceImpl implements AuditService {
    @Autowired
    AuditMapper auditMapper;
    @Override
    public void insertAudit(Application application) {
        log.debug("生成申请单对应的审批数据：application={}",application);
        //1.获取审批人id集合[106,103]
        List<Long> userIdList = application.getAuditUserIdList();
        //2.遍历审批人集合，有几个人，生成几条审批数据
        for (int i=0;i<userIdList.size();i++){
            Audit audit = new Audit();
            //设置申请单id
            audit.setApplicationId(application.getId());
            //设置审批人id
            audit.setAuditUserId(userIdList.get(i));
            //设置审批次序 直属领导次序为0 上上级次序为1
            audit.setAuditSort(i);
            //设置审批单状态
            if (i==0){
                // 0表示第1条审批数据，对应的人时直属领导，审批状态为“待我审核”
                audit.setAuditStatus(AuditStatusEnum.MY_PENDING.getCode());
            }else {
                // 1表示第2条审核数据，对应的人是上上级，审批状态为“待他人审核”
                audit.setAuditStatus(AuditStatusEnum.PENDING.getCode());
            }
            //设置新增时间
            audit.setCreateTime(new Date());
            //审批数据入库
            auditMapper.insert(audit);
        }
    }

    @Override
    public List<AuditVO> selectAuditByApplicationId(Long id) {
        log.debug("通过申请单id查询审批单：申请单id={}",id);
        return auditMapper.selectAuditByApplicationId(id);
    }
}
